package admin

import (
	"net/http"
	"strconv"
	"time"

	"rt.com/mocktool/admin/api"
	"rt.com/mocktool/mock"
	"rt.com/mocktool/proxy"
	"rt.com/mocktool/utils/file"
)

// Admin 管理服务器类
type Admin struct {
	// SIGINAL 关闭信号
	SIGINAL chan int
	// Server 后台服务器实例
	Server *http.Server
}

// Instance Mock包实例
var Instance = &Admin{}

// Start 启动管理员服务器
func (admin *Admin) Start(op chan int) {
	// 设置信号参数
	admin.SIGINAL = op
	// 创建服务路由实例
	handler := http.NewServeMux()
	// 配置HTML服务
	htmlPath := file.PathInExePath("html")
	handler.Handle("/", http.StripPrefix("/", http.FileServer(http.Dir(htmlPath))))
	// 配置服务器控制接口
	handler.HandleFunc("/func/restartServer", restartServer)
	// 配置接口列表
	api.RegisterAPI(handler)
	// 拼接地址
	address := ":" + strconv.Itoa(mock.Instance.GetConfig().AdminPort)
	// 构建服务器实例
	admin.Server = &http.Server{
		Addr:              address,
		Handler:           handler,
		ReadHeaderTimeout: 15 * time.Second,
		ReadTimeout:       15 * time.Second,
		WriteTimeout:      15 * time.Second,
	}
	// 阻塞开启服务
	admin.Server.ListenAndServe()
	// 阻塞结束发送1信号量重启服务
	admin.SIGINAL <- 1
}

// Restart 关闭后台服务器
func (admin *Admin) Restart() {
	admin.Server.Close()
}

// restartServer 重启服务接口
func restartServer(w http.ResponseWriter, r *http.Request) {
	api.DebugAPI(w, r)
	urlParams := r.URL.Query()
	typeParam := urlParams.Get("type")
	if typeParam == "0" {
		// 重启后台服务
		Instance.Restart()
	} else if typeParam == "1" {
		// 重启代理服务
		proxy.Instance.Restart()
	}
}
